/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package calpi;

import calpi.database.AlunosConnector;
import calpi.database.CursosConnector;
import calpi.database.DisciplinasConnector;
import calpi.database.DataBaseConnector;
import java.io.IOException;


/**
 *
 * @author Sem iNick
 */
public final class Connectors {

    /**
     * Usada para acessar o connector dos alunos
     */
    public static final int ALUNOS = 0;

    /**
     * Usada para acessar o connector dos cursos
     */
    public static final int CURSOS = 1;

    /**
     * Usada para acessar o connector da disciplinas
     */
    public static final int DISCIPLINAS = 2;

    // Gravará as referência as conectores dos dados
    private static DataBaseConnector[] connectors = new DataBaseConnector[3];

    /*
     * Usado para periodicamente fazer a gravação dos dados
     */
    private static Thread writer = null;
    private static boolean[] askWrite = new boolean[connectors.length];

    private Connectors() {
    }

    /**
     * Inicializa todos os connectores (Alunos, Cursos, Disciplinas}
     * @throws Exception Se ocorrer algum erro na incialização de algum connector
     */
    public static synchronized void initConnectors() throws Exception {

        CursosConnector cursoc = new CursosConnector();
        connectors[CURSOS] = cursoc;
        DisciplinasConnector discic = new DisciplinasConnector();
        connectors[DISCIPLINAS] = discic;
        connectors[ALUNOS] = new AlunosConnector(cursoc, discic);
        //Inicializa a thread que ficará encarregada de gravar os dados
        writer = new Thread(new Runnable() {

                    @Override
                    public void run() {

                        while(true) {

                            //Boa Noite Thread =P
                            try {

                                Thread.sleep(500);
                                writeAll();
                            } catch (Exception ie) {}
                        }
                    }
                });

         writer.start();
    }

    /**
     * Pega algum connector existente nos connectores criados
     * @param con Tipo do connector
     * @return Objeto relacionado ao connector
     * @throws IllegalArgumentException Se con for um tipo inválida
     */
    public static DataBaseConnector getConnector(int con) {

        if ((con < ALUNOS) || (con > DISCIPLINAS)) {

            throw new IllegalArgumentException("Connector inválido.");
        }

        return connectors[con];
    }

    public static synchronized void destroyConnectors() throws Throwable {

        for (DataBaseConnector dbc : connectors) {

            if (dbc != null) {

                dbc.closeConnection();
            }
        }
    }

    public static void askWrite(int con) {

        if ((con < ALUNOS) || (con > DISCIPLINAS)) {

            throw new IllegalArgumentException("Tipo do connector inválido");
        }

        askWrite[con] = true;
    }

    public static synchronized void writeAll() throws IOException {

        System.out.println("Verificando pedidos... ");
        //Verifica se há algum pedido de escrita
        for (int i = 0; i < connectors.length; i++) {

            if (askWrite[i]) {

                System.out.println("Tentando... " + i);
                try {

                    connectors[i].writeBuffer();
                    //Se a gravação foi ok
                    askWrite[i] = false;
                    System.out.println("OK");
                } catch (IOException ex) {}
            }
        }
        System.out.println("Done!");
    }
}
